/*******************************************************************************
* Copyright (c) 2013, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.team.build.internal.hjplugin.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import hudson.model.FreeStyleBuild;
import hudson.model.Result;
import hudson.model.FreeStyleProject;
import hudson.model.ParameterDefinition;
import hudson.model.ParametersAction;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.StringParameterDefinition;
import hudson.model.StringParameterValue;
import hudson.scm.PollingResult;
import hudson.scm.PollingResult.Change;
import hudson.tools.ToolProperty;
import hudson.util.FormValidation;
import hudson.util.Secret;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.recipes.WithTimeout;
import com.google.common.io.Files;
import com.ibm.team.build.internal.hjplugin.InvalidCredentialsException;
import com.ibm.team.build.internal.hjplugin.Messages;
import com.ibm.team.build.internal.hjplugin.RTCBuildResultAction;
import com.ibm.team.build.internal.hjplugin.RTCBuildToolInstallation;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogChangeSetEntry;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogChangeSetEntry.WorkItemDesc;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogSet;
import com.ibm.team.build.internal.hjplugin.RTCFacadeFactory.RTCFacadeWrapper;
import com.ibm.team.build.internal.hjplugin.RTCLoginInfo;
import com.ibm.team.build.internal.hjplugin.RTCRepositoryBrowser;
import com.ibm.team.build.internal.hjplugin.RTCScm;
import com.ibm.team.build.internal.hjplugin.RTCScm.BuildType;
import com.ibm.team.build.internal.hjplugin.RTCScm.DescriptorImpl;
import com.ibm.team.build.internal.hjplugin.tests.utils.AbstractTestCase;
import com.ibm.team.build.internal.hjplugin.tests.utils.Utils;
public class RTCScmIT extends AbstractTestCase {
private static final String BUILD_TOOLKIT = "buildToolkit";
private static final String USER_ID = "userId";
private static final String PASSWORD = "password";
private static final String PASSWORD_FILE = "passwordFile";
private static final String CREDENTIALS_ID = "_.credentialsId";
private static final String TIMEOUT = "timeout";
private static final String TEST_SERVER_URI = "https://localhost:9443/jazz";
private static final String TEST_TIMEOUT = "480";
private static final String TEST_USER_ID = "bill";
private static final String TEST_PASSWORD = "bill";
private static final String TEST_PASSWORD_FILE = "C:/Users/bill/bill-password";
private static final String TEST_CRED_ID = "5678";
private static final String TEST_BUILD_WORKSPACE = "compile-and-test";
private static final String TEST_BUILD_DEFINITION = "_Sf_R8EhyEeKuMu7IPRTOeQ";
private static final String TEST_BUILD_SNAPSHOT = "_vf_F8EyGeBuAp7IPRTOeQ";
private static final String TEST_BUILD_STREAM = "compile-and-test-stream";
private static final String CONFIG_TOOLKIT_NAME = "config_toolkit";
private String buildTool;
private String serverURI;
private String timeout;
private String userId;
private String password;
private int timeoutInt;
@Rule public JenkinsRule r = new JenkinsRule();
private RTCScm createEmptyRTCScm() {
BuildType buildSource = new BuildType(RTCScm.BUILD_WORKSPACE_TYPE, "", "", "", "");
return new RTCScm(false, "", "", 0, "", Secret.fromString(""), "", "", buildSource, false);
}
private RTCScm getRTCScm(BuildType buildType) throws InvalidCredentialsException {
RTCBuildToolInstallation tool = new RTCBuildToolInstallation(CONFIG_TOOLKIT_NAME, Config.DEFAULT.getToolkit(), Collections.<ToolProperty<?>> emptyList());
tool.getDescriptor().setInstallations(tool);
RTCLoginInfo loginInfo = Config.DEFAULT.getLoginInfo();
RTCScm scm = new RTCScm(true, "config_toolkit", loginInfo.getServerUri(), loginInfo.getTimeout(), loginInfo.getUserId(),
Secret.fromString(loginInfo.getPassword()), "", "", buildType, false);
return scm;
}
private RTCScm createTestOverrideGlobalRTCScm(boolean useCreds) {
BuildType buildSource = new BuildType(RTCScm.BUILD_DEFINITION_TYPE, TEST_BUILD_DEFINITION, TEST_BUILD_WORKSPACE, TEST_BUILD_SNAPSHOT, TEST_BUILD_STREAM);
return new RTCScm(true, "", TEST_SERVER_URI, Integer.parseInt(TEST_TIMEOUT), TEST_USER_ID, Secret.fromString(TEST_PASSWORD), TEST_PASSWORD_FILE,
useCreds ? TEST_CRED_ID : null, buildSource, false);
}
@Before
public void setUp() throws Exception {
if (Config.DEFAULT.isConfigured()) {
Config config = Config.DEFAULT;
buildTool = CONFIG_TOOLKIT_NAME;
serverURI = config.getServerURI();
timeoutInt = config.getTimeout();
timeout = String.valueOf(config.getTimeout());
userId = config.getUserID();
password = config.getPassword();
}
if (!Config.DEFAULT.isConfigured()) {
return;
}
Utils.deleteTemporaryWorkspaces();
}
@After
public void tearDown() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Utils.deleteTemporaryWorkspaces();
}
@Test
public void testRTCScmConstructor() throws Exception {
if (Config.DEFAULT.isConfigured()) {
RTCScm scm = createTestOverrideGlobalRTCScm(true);
assertEquals(TEST_SERVER_URI, scm.getServerURI());
assertEquals(Integer.parseInt(TEST_TIMEOUT), scm.getTimeout());
assertEquals(TEST_CRED_ID, scm.getCredentialsId());
assertEquals(null, scm.getUserId());
assertEquals(null, scm.getPassword());
assertEquals(null, scm.getPasswordFile());
assertEquals(RTCScm.BUILD_DEFINITION_TYPE, scm.getBuildType().value);
assertEquals(RTCScm.BUILD_DEFINITION_TYPE, scm.getBuildTypeStr());
assertEquals(TEST_BUILD_DEFINITION, scm.getBuildDefinition());
assertEquals(TEST_BUILD_WORKSPACE, scm.getBuildWorkspace());
assertEquals(TEST_BUILD_SNAPSHOT, scm.getBuildSnapshot());
RTCChangeLogChangeSetEntry.WorkItemDesc workItem = new WorkItemDesc();
workItem.setNumber("2");
RTCRepositoryBrowser browser = (RTCRepositoryBrowser) scm.getEffectiveBrowser();
assertEquals(TEST_SERVER_URI + "/resource/itemName/com.ibm.team.workitem.WorkItem/2" , browser.getWorkItemLink(workItem).toString());
scm = createTestOverrideGlobalRTCScm(false);
assertEquals(TEST_SERVER_URI, scm.getServerURI());
assertEquals(Integer.parseInt(TEST_TIMEOUT), scm.getTimeout());
assertEquals(null, scm.getCredentialsId());
assertEquals(TEST_USER_ID, scm.getUserId());
assertEquals(TEST_PASSWORD, scm.getPassword());
assertEquals(TEST_PASSWORD_FILE, scm.getPasswordFile());
assertEquals(RTCScm.BUILD_DEFINITION_TYPE, scm.getBuildType().value);
assertEquals(RTCScm.BUILD_DEFINITION_TYPE, scm.getBuildTypeStr());
assertEquals(TEST_BUILD_DEFINITION, scm.getBuildDefinition());
assertEquals(TEST_BUILD_WORKSPACE, scm.getBuildWorkspace());
assertEquals(TEST_BUILD_SNAPSHOT, scm.getBuildSnapshot());
browser = (RTCRepositoryBrowser) scm.getEffectiveBrowser();
assertEquals(TEST_SERVER_URI + "/resource/itemName/com.ibm.team.workitem.WorkItem/2" , browser.getWorkItemLink(workItem).toString());
}
}
@Test public void testDoCheckBuildTool() throws IOException {
if (Config.DEFAULT.isConfigured()) {
DescriptorImpl descriptor = (DescriptorImpl) r.getInstance().getDescriptor(RTCScm.class);
// null is not a build toolkit
assertDoCheckBuildTool(descriptor, FormValidation.Kind.ERROR, null);
assertDoCheckBuildTool(descriptor, FormValidation.Kind.ERROR, "");
// null is not a build toolkit path
assertDoCheckBuildToolKitPath(FormValidation.Kind.ERROR, null);
assertDoCheckBuildToolKitPath(FormValidation.Kind.ERROR, "");
File tempFolder = Files.createTempDir();
File tempBuildToolkitTaskDefsXmlFile = new File(tempFolder, RTCBuildToolInstallation.BUILD_TOOLKIT_TASK_DEFS_XML);
tempBuildToolkitTaskDefsXmlFile.createNewFile();
String tempBuildToolkitTaskDefsXmlPath = tempBuildToolkitTaskDefsXmlFile.getAbsolutePath();
// build toolkit task defs file is not a build toolkit
assertDoCheckBuildToolKitPath(FormValidation.Kind.ERROR, tempBuildToolkitTaskDefsXmlPath);
String tempFolderPath = tempFolder.getAbsolutePath();
// folder containing build toolkit task defs file is a build toolkit ... probably ;-)
assertDoCheckBuildToolKitPath(FormValidation.Kind.OK, tempFolderPath);
boolean deleted = tempBuildToolkitTaskDefsXmlFile.delete();
if (deleted) {
// folder not containing build toolkit task defs file is not a build toolkit
assertDoCheckBuildToolKitPath(FormValidation.Kind.ERROR, tempFolderPath);
// missing file is not a build toolkit
assertDoCheckBuildToolKitPath(FormValidation.Kind.ERROR, tempBuildToolkitTaskDefsXmlPath);
}
deleted = tempFolder.delete();
if (deleted) {
// missing folder is not a build toolkit
assertDoCheckBuildToolKitPath(FormValidation.Kind.ERROR, tempFolderPath);
}
}
}
private void assertDoCheckBuildToolKitPath(FormValidation.Kind kind,
String buildToolkitPath) {
FormValidation validation = RTCBuildToolInstallation.validateBuildToolkit(false, buildToolkitPath);
assertEquals("Expected toolkit path validation " + kind + ": " + BUILD_TOOLKIT + "=\"" + buildToolkitPath + "\"", kind, validation.kind);
}
private void assertDoCheckBuildTool(DescriptorImpl descriptor, FormValidation.Kind kind, String buildToolkit) {
FormValidation validation = descriptor.doCheckBuildTool(buildToolkit);
assertEquals("Expected toolkit validation " + kind + ": " + BUILD_TOOLKIT + "=\"" + buildToolkit + "\"", kind, validation.kind);
}
@Test public void testDoCheckCredentials() throws Exception {
if (Config.DEFAULT.isConfigured()) {
FreeStyleProject project = r.createFreeStyleProject();
RTCScm rtcScm = createEmptyRTCScm();
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl) project.getDescriptorByName(RTCScm.class.getName());
assertDoCheckCredentials(descriptor, FormValidation.Kind.ERROR, null, null, null, null);
assertDoCheckCredentials(descriptor, FormValidation.Kind.ERROR, null, "", null, null);
assertDoCheckCredentials(descriptor, FormValidation.Kind.ERROR, null, null, "", null);
assertDoCheckCredentials(descriptor, FormValidation.Kind.ERROR, null, null, null, "");
assertDoCheckCredentials(descriptor, FormValidation.Kind.ERROR, "", "", "", "");
assertDoCheckCredentials(descriptor, FormValidation.Kind.OK, null, null, null, TEST_CRED_ID);
assertDoCheckCredentials(descriptor, FormValidation.Kind.OK, "", "", "", TEST_CRED_ID);
}
}
@Test public void testDoCheckUserId() throws Exception {
if (Config.DEFAULT.isConfigured()) {
FreeStyleProject project = r.createFreeStyleProject();
RTCScm rtcScm = createEmptyRTCScm();
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl) project.getDescriptorByName(RTCScm.class.getName());
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, null, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, "", null, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, "", null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, "", "", "");
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, null, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, "", null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, TEST_PASSWORD_FILE, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, "", TEST_PASSWORD_FILE, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, TEST_PASSWORD_FILE, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, null, null, null, TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, "", "", "", TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, null, TEST_PASSWORD, null, TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, "", TEST_PASSWORD, null, TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, "", null, TEST_PASSWORD_FILE, TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.OK, null, null, TEST_PASSWORD_FILE, TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.ERROR, null, TEST_PASSWORD, null, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.ERROR, null, TEST_PASSWORD, "", null);
assertDoCheckUserId(descriptor, FormValidation.Kind.ERROR, null, null, TEST_PASSWORD_FILE, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.ERROR, null, "", TEST_PASSWORD_FILE, null);
assertDoCheckUserId(descriptor, FormValidation.Kind.WARNING, TEST_USER_ID, null, null, TEST_CRED_ID);
assertDoCheckUserId(descriptor, FormValidation.Kind.WARNING, TEST_USER_ID, TEST_PASSWORD, TEST_PASSWORD_FILE, TEST_CRED_ID);
}
}
@Test public void testDoCheckPassword() throws Exception {
if (Config.DEFAULT.isConfigured()) {
FreeStyleProject project = r.createFreeStyleProject();
RTCScm rtcScm = createEmptyRTCScm();
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl) project.getDescriptorByName(RTCScm.class.getName());
assertDoCheckPassword(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, null, null, null);
assertDoCheckPassword(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, "", null, null);
assertDoCheckPassword(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, null, "", null);
assertDoCheckPassword(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, "", "", "");
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, null, null);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, "", null);
assertDoCheckPassword(descriptor, FormValidation.Kind.WARNING, "", TEST_PASSWORD, null, TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.WARNING, null, TEST_PASSWORD, "", TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, "", null, TEST_PASSWORD_FILE, TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, null, "", TEST_PASSWORD_FILE, TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, TEST_PASSWORD_FILE, null);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, "", TEST_PASSWORD_FILE, null);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, null, null, null, TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, "", "", "", TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.WARNING, TEST_USER_ID, TEST_PASSWORD, TEST_PASSWORD_FILE, null);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, null, TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, TEST_PASSWORD_FILE, TEST_CRED_ID);
assertDoCheckPassword(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, null, TEST_CRED_ID);
}
}
@Test public void testDoCheckPasswordFile() throws Exception {
if (Config.DEFAULT.isConfigured()) {
File testPasswordFileFile = File.createTempFile("ADMIN-password", null);
String testPasswordFile = testPasswordFileFile.getAbsolutePath();
FreeStyleProject project = r.createFreeStyleProject();
RTCScm rtcScm = createEmptyRTCScm();
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl) project.getDescriptorByName(RTCScm.class.getName());
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, null, null, null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, "", null, null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, null, "", null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, "", "", "");
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, null, null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, "", null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, testPasswordFile, null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, "", testPasswordFile, null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, null, null, null, TEST_CRED_ID);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, "", "", "", TEST_CRED_ID);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.WARNING, TEST_USER_ID, TEST_PASSWORD, testPasswordFile, null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, null, "doesnotexist", null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.ERROR, TEST_USER_ID, TEST_PASSWORD, "doesnotexist", null);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, null, TEST_CRED_ID);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, TEST_PASSWORD, testPasswordFile, TEST_CRED_ID);
assertDoCheckPasswordFile(descriptor, FormValidation.Kind.OK, TEST_USER_ID, null, testPasswordFile, TEST_CRED_ID);
testPasswordFileFile.delete();
}
}
private void assertDoCheckCredentials(DescriptorImpl descriptor, FormValidation.Kind kind, String userId, String password, String passwordFile, String credId) {
FormValidation validation = descriptor.doCheckCredentialsId(credId, userId, password, passwordFile);
assertEquals("Expected credentials validation " + kind + ": "
+ CREDENTIALS_ID + "=\"" + credId + "\", " + USER_ID + "=\""
+ userId + "\", " + PASSWORD + "=\"" + password + "\", "
+ PASSWORD_FILE + "=\"" + passwordFile + "\"", kind,
validation.kind);
}
private void assertDoCheckUserId(DescriptorImpl descriptor, FormValidation.Kind kind, String userId, String password, String passwordFile, String credId) {
FormValidation validation = descriptor.doCheckUserId(credId, userId, password, passwordFile);
assertEquals("Expected credentials validation " + kind + ": "
+ CREDENTIALS_ID + "=\"" + credId + "\", " + USER_ID + "=\""
+ userId + "\", " + PASSWORD + "=\"" + password + "\", "
+ PASSWORD_FILE + "=\"" + passwordFile + "\"", kind,
validation.kind);
}
private void assertDoCheckPassword(DescriptorImpl descriptor, FormValidation.Kind kind, String userId, String password, String passwordFile, String credId) {
FormValidation validation = descriptor.doCheckPassword(credId, userId, password, passwordFile);
assertEquals("Expected password validation " + kind + ": "
+ CREDENTIALS_ID + "=\"" + credId + "\", " + USER_ID + "=\""
+ userId + "\", " + PASSWORD + "=\"" + password + "\", "
+ PASSWORD_FILE + "=\"" + passwordFile + "\"", kind,
validation.kind);
}
private void assertDoCheckPasswordFile(DescriptorImpl descriptor, FormValidation.Kind kind, String userId, String password, String passwordFile, String credId) {
FormValidation validation = descriptor.doCheckPasswordFile(credId, userId, password, passwordFile);
assertEquals("Expected password validation " + kind + ": "
+ CREDENTIALS_ID + "=\"" + credId + "\", " + USER_ID + "=\""
+ userId + "\", " + PASSWORD + "=\"" + password + "\", "
+ PASSWORD_FILE + "=\"" + passwordFile + "\"", kind,
validation.kind);
}
@Test public void testDoCheckTimeout() throws Exception {
if (Config.DEFAULT.isConfigured()) {
FreeStyleProject project = r.createFreeStyleProject();
RTCScm rtcScm = createEmptyRTCScm();
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl) project.getDescriptorByName(RTCScm.class.getName());
assertDoCheckTimeout(descriptor, FormValidation.Kind.ERROR, null);
assertDoCheckTimeout(descriptor, FormValidation.Kind.ERROR, "");
assertDoCheckTimeout(descriptor, FormValidation.Kind.ERROR, "-1");
assertDoCheckTimeout(descriptor, FormValidation.Kind.ERROR, "0");
assertDoCheckTimeout(descriptor, FormValidation.Kind.OK, "1000");
assertDoCheckTimeout(descriptor, FormValidation.Kind.OK, TEST_TIMEOUT);
}
}
private void assertDoCheckTimeout(DescriptorImpl descriptor, FormValidation.Kind kind, String timeout) {
FormValidation validation = descriptor.doCheckTimeout(timeout);
assertEquals("Expected timeout validation " + kind + ": " + TIMEOUT + "=\"" + timeout + "\"", kind, validation.kind);
}
@SuppressWarnings("unchecked")
@Test public void testDoValidateBuildWorkspaceConfiguration() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
FreeStyleProject project = r.createFreeStyleProject();
// that build type that we set here is just for creation, it is not significant for the following validation
// we manually pass the values to the validation method
BuildType buildType = new BuildType(RTCScm.BUILD_WORKSPACE_TYPE, "SomeBuildWorkspace", null, null, "");
RTCScm rtcScm = getRTCScm(buildType);
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl)project.getDescriptorByName(RTCScm.class.getName());
// buildWorkspace - null
FormValidation result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, userId, password,
null, null, "false", null);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_workspace_empty(), result.renderHtml());
// buildWorkspace - empty string
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_workspace_empty(), result.renderHtml());
// buildWorkspace - blank string
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", " ");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_workspace_empty(), result.renderHtml());
// invalid connect info
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, null, password, null, null,
"false", "test");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCLoginInfo_missing_userid(), result.renderHtml());
// valid connect info - using build toolkit and invalid workspace
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "test");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("Unable to find a workspace with name "test"", result.renderHtml());
// create workspaces
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
Map<String, String> setupArtifacts = (Map<String, String>)testingFacade.invoke("setupTestBuildWorkspace", new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // singleWorkspaceName,
String.class }, // multipleWorkspaceName
serverURI, userId, password, timeoutInt, "Singly Occuring=WS", "Multiple Occurrence=WS");
try {
// warning connect info - avoidUsingBuildToolkit and buildTool is null, invalid workspace - multiple workspace
// warning connect info and error workspace - only error should be displayed
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", "Multiple Occurrence=WS");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("More than 1 repository workspace has the name "Multiple Occurrence=WS"", result.renderHtml());
// valid connect info - using build toolkit and warning workspace (parameterized values)
// only warning should be displayed
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "${rtcRepositoryWorkspace}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_repository_workspace_not_validated(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and warning workspace (parameterized values)
// both the warnings should be displayed
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", "", serverURI, timeout, userId, password, null, null,
"true", "${rtcRepositoryWorkspace}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_tool_needed_for_job() + "<br/>" + Messages.RTCScm_repository_workspace_not_validated(),
result.renderHtml());
// valid connect info - using build toolkit and valid workspace
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "Singly Occuring=WS");
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, valid workspace
// warning connect info and valid workspace - only warning should be displayed
result = descriptor.doValidateBuildWorkspaceConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", "Singly Occuring=WS");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_tool_needed_for_job(), result.renderHtml());
} finally {
Utils.tearDown(testingFacade, Config.DEFAULT, setupArtifacts);
}
}
@Test public void testDoValidateBuildDefinitionConfiguration() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
FreeStyleProject project = r.createFreeStyleProject();
// that build type that we set here is just for creation, it is not significant for the following validation
// we manually pass the values to the validation method
BuildType buildType = new BuildType(RTCScm.BUILD_DEFINITION_TYPE, "SomeBuildDefinition", null, null, "");
RTCScm rtcScm = getRTCScm(buildType);
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl)project.getDescriptorByName(RTCScm.class.getName());
// buildDefinition - null
FormValidation result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, userId, password,
null, null, "false", null);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_definition_empty(), result.renderHtml());
// buildDefinition - empty string
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_definition_empty(), result.renderHtml());
// buildDefinition - blank string
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", " ");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_definition_empty(), result.renderHtml());
// invalid connect info
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, null, password, null, null,
"false", "test");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCLoginInfo_missing_userid(), result.renderHtml());
// valid connect info - using build toolkit and invalid build definition
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "test");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("Unable to find a build definition with ID: "test"", result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, invalid build definition
// warning connect info and error build definition - only error should be displayed
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", "test");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("Unable to find a build definition with name "test"", result.renderHtml());
// create buildDefinition
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String buildDefinitionName = getBuildDefinitionUniqueName();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade.invoke(
"setupTestBuildDefinition", new Class[] {
String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class}, // Build Definition Name,
serverURI, userId, password, timeoutInt, buildDefinitionName);
try {
// valid connect info - using build toolkit and warning build definition (parameterized value)
// only warning should be displayed
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "${rtcBuildDefinition}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_definition_not_validated(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, warning build definition (parameterized value)
// both the warning messages should be displayed
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_tool_needed_for_job() + "<br/>" + Messages.RTCScm_build_definition_not_validated(), result.renderHtml());
// valid connect info - using build toolkit and valid build definition
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", buildDefinitionName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, valid build definition
// only warning message should be displayed
result = descriptor.doValidateBuildDefinitionConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", buildDefinitionName);
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_tool_needed_for_job(), result.renderHtml());
} finally {
Utils.tearDown(testingFacade, Config.DEFAULT, setupArtifacts);
}
}
@SuppressWarnings("unchecked")
@Test public void testDoValidateBuildStreamConfiguration() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
FreeStyleProject project = r.createFreeStyleProject();
// that build type that we set here is just for creation, it is not significant for the following validation
// we manually pass the values to the validation method
BuildType buildType = new BuildType(RTCScm.BUILD_STREAM_TYPE, "SomeBuildStream", null, null, "");
RTCScm rtcScm = getRTCScm(buildType);
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl)project.getDescriptorByName(RTCScm.class.getName());
// buildStream - null
FormValidation result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password,
null, null, "false", null, null);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_stream_empty(), result.renderHtml());
// buildStream - empty string
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", null, "");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_stream_empty(), result.renderHtml());
// buildStream - blank string
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", null, " ");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_stream_empty(), result.renderHtml());
// invalid connect info
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, null, password, null, null,
"false", null, "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCLoginInfo_missing_userid(), result.renderHtml());
// create project area and build stream
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String projectAreaName = getUniqueName("testDoValidateBuildStreamConfiguration");
String streamName = getUniqueName("testDoValidateBuildStreamConfigurationStream");
// create a project area with a single team area
Map<String, String> setupArtifacts = (Map<String, String>)testingFacade.invoke("setupTestBuildStream_basic", new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // projectAreaName
String.class }, //streamName
serverURI, userId, password, timeoutInt, projectAreaName, streamName);
try {
// valid connect info - using build toolkit and non-null invalid process area, valid stream
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "testProject", streamName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A project area with name "testProject" cannot be found.", result.renderHtml());
// valid connect info - avoidUsingBuildToolkiit and build toolkit is provided and non-null invalid process area, valid stream
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", "testProject", streamName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A project area with name "testProject" cannot be found.", result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, non-null invalid process area, valid stream
// warning connect info and error project area - only error should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", "testProject", streamName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_process_area(), result.renderHtml());
// valid connect info - using build toolkit and non-null invalid process area, warning stream (parameterized value)
// only error message should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "testProject", "${rtcStream}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A project area with name "testProject" cannot be found.", result.renderHtml());
// valid connect info - avoidUsingBuildToolkiit and build toolkit is provided and non-null invalid process area, warning stream (parameterized value)
// only error message should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", "testProject", "${rtcStream}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A project area with name "testProject" cannot be found.", result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, non-null invalid process area, warning stream (parameterized value)
// warning connect info, warning stream and error project area - only error should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", "testProject", "${rtcStream}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_process_area(), result.renderHtml());
// valid connect info - using build tool kit, valid process area, invalid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", projectAreaName, "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "testStream" cannot be found in the project area "" + projectAreaName + "".", result.renderHtml());
// valid connect info - avoidUsingBuildToolkit and buildTool is provided, valid process area, invalid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", projectAreaName, "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "testStream" cannot be found in the project area "" + projectAreaName + "".", result.renderHtml());
// valid connect info - using build tool kit, valid process area(null), invalid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", null, "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "testStream" cannot be found in the repository.", result.renderHtml());
// valid connect info - avoidUsingBuildToolkit and buildTool is provided, valid process area(empty), invalid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", " ", "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "testStream" cannot be found in the repository.", result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, valid process area, invalid stream value
// warning connect info and error project area - only error should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", projectAreaName, "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_process_area(), result.renderHtml());
// warning connect info avoidUsingBuildToolkit and buildTool is invalid, valid(null) process area, invalid stream value
// warning connect info and error stream - only error should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", "test", serverURI, timeout, userId, password, null, null,
"true", null, "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "testStream" cannot be found in the repository.", result.renderHtml());
// valid connectinfo - using build toolkit, valid process area, warning stream value (parameterized value)
// only warning message should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", projectAreaName, "${rtcStream}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_stream_not_validated(), result.renderHtml());
// valid connectinfo - avoidUsingBuildToolkit and buildTool is provided, valid process area, warning stream value (parameterized value)
// only warning message should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", projectAreaName, "${rtcStream}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_stream_not_validated(), result.renderHtml());
// valid connectinfo - using build toolkit, valid process area (null), warning stream value (parameterized value)
// only warning message should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", null, "${rtcStream}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_stream_not_validated(), result.renderHtml());
// valid connectinfo - avoidUsingBuildToolkit and a buildTool is provided, valid process area (null), warning stream value (parameterized value)
// only warning message should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", null, "${rtcStream}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_stream_not_validated(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool, valid process area, warning stream value (parameterized value)
// warning connect info, warning stream value and error project area - only error should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", projectAreaName, "${rtcStream}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_process_area(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool, valid (null) process area, warning stream value (parameterized value)
// warning connect info, warning stream value and validation success - both the warning messages should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", null, "${rtcStream}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_tool_needed_for_job() + "<br/>" + Messages.RTCScm_stream_not_validated(), result.renderHtml());
// valid connectinfo - using build toolkit, valid process area, valid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", projectAreaName, streamName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo - avoidUsingBuildToolkit and buildTool is provided, valid process area, valid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", projectAreaName, streamName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo - using build toolkit, valid process area (null), valid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", null, streamName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo - avoidUsingBuildToolkit and a buildTool is provided, valid process area (null), valid stream value
result = descriptor.doValidateBuildStreamConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"true", null, streamName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool, valid process area, valid stream value
// warning connect info and error project area - only error should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", projectAreaName, streamName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_process_area(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool, valid (null) process area, valid stream value
// warning connect info and validation success - only warning should be displayed
result = descriptor.doValidateBuildStreamConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null,
"true", null, streamName);
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_tool_needed_for_job(), result.renderHtml());
} finally {
Utils.tearDown(testingFacade, Config.DEFAULT, setupArtifacts);
}
}
@SuppressWarnings("unchecked")
@Test public void testDoValidateBuildSnapshotConfiguration() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
FreeStyleProject project = r.createFreeStyleProject();
// that build type that we set here is just for creation, it is not significant for the following validation
// we manually pass the values to the validation method
BuildType buildType = new BuildType(RTCScm.BUILD_SNAPSHOT_TYPE, "SomeBuildSnapshot", null, null, "");
RTCScm rtcScm = getRTCScm(buildType);
project.setScm(rtcScm);
DescriptorImpl descriptor = (DescriptorImpl)project.getDescriptorByName(RTCScm.class.getName());
// buildSnapshot - null
FormValidation result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password,
null, null, "false", "", "", "", "", null);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_empty(), result.renderHtml());
// buildSnapshot - empty string
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "", "", "", "", "");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_empty(), result.renderHtml());
// buildSnapshot - blank string
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "", "", "", "", " ");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_empty(), result.renderHtml());
// invalid connect info
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, null, password, null, null, "false",
"", "", "", "", "testStream");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCLoginInfo_missing_userid(), result.renderHtml());
// create project area, build stream, and a snapshot
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String projectAreaName = getUniqueName("testDoValidateBuildSnapshotConfiguration");
String streamName = getUniqueName("testDoValidateBuildSnapshotConfigurationStream");
String workspaceName = getUniqueName("testDoValidateBuildSnapshotConfigurationWorkspace");
String snapshotName = getUniqueName("testDoValidateBuildSnapshotConfigurationSnapshot");
String wsSnapshotName = "ws" + snapshotName;
// create a project area with a single team area
Map<String, String> setupArtifacts = (Map<String, String>)testingFacade.invoke("setupTestBuildSnapshot_basic", new Class[] {
String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // projectAreaName
String.class, // streamName
String.class,
String.class }, // snapshotName
serverURI, userId, password, timeoutInt, projectAreaName, streamName, workspaceName, snapshotName);
try {
// warning connect info - avoidUsingBuildToolkit and buildTool is null, valid snapshot value
// warning connect info and cannot validate snapshot error - only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null, "true",
"", "", "", "", snapshotName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_snapshot(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, warning snapshot value (job
// property)
// warning connect info and cannot validate snapshot error - only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null, "true",
"", "", "", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_snapshot(), result.renderHtml());
// warning connect info - avoidUsingBuildToolkit and buildTool is null, invalid snapshot value
// warning connect info and error snapshot - only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", null, serverURI, timeout, userId, password, null, null, "true",
"", "", "", "", "testSnapshot");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals(Messages.RTCScm_build_toolkit_required_to_validate_snapshot(), result.renderHtml());
// valid connect info, invalid snapshot value
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "", "", "", "", "testSnapshot");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A snapshot with name "testSnapshot" cannot be found in the repository.", result.renderHtml());
// valid connectinfo, valid snapshot value
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "", "", "", "", snapshotName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo, valid snapshot value, with snapshotOwnerType set to none
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "none", "", "", "", snapshotName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo, valid snapshot value, with snapshotOwnerType set to workspace
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "workspace", "", "", workspaceName, wsSnapshotName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo, valid snapshot value, with snapshotOwnerType set to stream without specifying project
// area, but having a workspace name
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", "", streamName, "ignoreWorkspaceName", snapshotName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo, valid snapshot value, with snapshotOwnerType set to stream with specifying project
// area
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", projectAreaName, streamName, "", snapshotName);
assertEquals(FormValidation.Kind.OK, result.kind);
assertEquals(Messages.RTCScm_validation_success(), result.renderHtml());
// valid connectinfo, valid snapshot value, invalid snapshotOwnerType set to workspace
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "workspace", "", "", workspaceName + "invalid", wsSnapshotName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("Unable to find a workspace with name "" + workspaceName + "invalid"", result.renderHtml());
// valid connectinfo, valid snapshot value, invalid snapshotOwnerType set to stream without specifying
// project area, but having a workspace name
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", "", streamName + "invalid", "ignoreWorkspaceName", snapshotName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "" + streamName + "invalid" cannot be found in the repository.", result.renderHtml());
// valid connectinfo, valid snapshot value, invalid snapshotOwnerType set to stream with specifying project
// area
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", projectAreaName, streamName + "invalid", "", snapshotName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "" + streamName + "invalid" cannot be found in the project area "" + projectAreaName
+ "".", result.renderHtml());
// valid connectinfo, valid snapshot value, invalid snapshotOwnerType set to stream with specifying project
// area
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", projectAreaName + "invalid", streamName + "invalid", "", snapshotName);
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A project area with name "" + projectAreaName + "invalid" cannot be found.", result.renderHtml());
// valid connectinfo, warning snapshot value(job property)
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", null, "", "", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, warning snapshot value(job property), valid snapshotOwnerType set to none
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "none", "", "", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, warning snapshot value(job property), valid snapshotOwnerType set to workspace
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "workspace", "", "", workspaceName, "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, warning snapshot value(job property), valid snapshotOwnerType set to workspace no workspaceName
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "workspace", "", "", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, warning snapshot value(job property), valid snapshotOwnerType set to stream without
// specifying project area, but having a workspace name
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", "", streamName, "ignoreWorkspaceName", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, warning snapshot value(job property), valid snapshotOwnerType set to stream without
// specifying project area and stream name
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", "", "", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, valid snapshot value, valid snapshotOwnerType set to stream with specifying project
// area
// only warning should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", projectAreaName, streamName, "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.WARNING, result.kind);
assertEquals(Messages.RTCScm_build_snapshot_not_validated(), result.renderHtml());
// valid connectinfo, warning snapshot value(job property), invalid snapshotOwnerType set to workspace
// only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "workspace", "", "", workspaceName + "invalid", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("Unable to find a workspace with name "" + workspaceName + "invalid"", result.renderHtml());
// valid connectinfo, warning snapshot value(job property), invalid snapshotOwnerType set to stream without
// specifying project area, but having a workspace name
// only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", "", streamName + "invalid", "ignoreWorkspaceName", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "" + streamName + "invalid" cannot be found in the repository.", result.renderHtml());
// valid connectinfo, valid snapshot value, invalid snapshotOwnerType set to stream with specifying project
// area
// only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", projectAreaName, streamName + "invalid", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A stream with name "" + streamName + "invalid" cannot be found in the project area "" + projectAreaName
+ "".", result.renderHtml());
// valid connectinfo, valid snapshot value, invalid snapshotOwnerType set to stream with specifying project
// area
// only error should be displayed
result = descriptor.doValidateBuildSnapshotConfiguration(project, "true", buildTool, serverURI, timeout, userId, password, null, null,
"false", "stream", projectAreaName + "invalid", streamName + "invalid", "", "${rtcBuildSnapshot}");
assertEquals(FormValidation.Kind.ERROR, result.kind);
assertEquals("A project area with name "" + projectAreaName + "invalid" cannot be found.", result.renderHtml());
} finally {
testingFacade.invoke("tearDown", new Class[] { String.class, // serverURI
String.class, // userId
String.class, // password
int.class, // timeout
Map.class }, // setupArtifacts
serverURI, userId, password, timeoutInt, setupArtifacts);
}
}
/**
* Verify that build definition item id and name is found in the changelogset
* @throws Exception
*/
@WithTimeout(600)
@Test
public void buildDefinitionNameItemIdPairFoundInChangeLogSet() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
String buildDefinitionItemId = setupArtifacts.get(Utils.ARTIFACT_BUILDDEFINITION_ITEM_ID);
try {
// Setup a build with build definition configuration
FreeStyleProject prj = Utils.setupFreeStyleJobForBuildDefinition(r, buildDefinitionId);
ArrayList<ParametersAction> pActions = new ArrayList<ParametersAction> ();
pActions.add(new ParametersAction(new StringParameterValue("buildResultUUID", "")));
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, pActions);
// Get the buildresultUUID from actions and insert it into setupArtifacts
List<RTCBuildResultAction> rtcActions = build.getActions(RTCBuildResultAction.class);
assertEquals(1, rtcActions.size());
RTCBuildResultAction action = rtcActions.get(0);
// Verify build result getting created
assertNotNull(action.getBuildResultUUID());
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_ID, action.getBuildResultUUID());
RTCChangeLogSet changelog = (RTCChangeLogSet) build.getChangeSet();
assertEquals(buildDefinitionItemId, changelog.getBuildDefinitionItemId());
assertEquals(buildDefinitionId, changelog.getBuildDefinitionName());
// No previous build url is written for build definition builds
assertEquals("", changelog.getPreviousBuildUrl());
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Verify that Repository workspace item id and name are found in
* Changelogset
* @throws Exception
*/
@WithTimeout(600)
@Test
public void repositoryWorkspaceNameItemIdPairFoundInChangeLogSet() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String streamName = getStreamUniqueName();
Map<String, String> setupArtifacts = Utils.setUpBuildStream(testingFacade, defaultC, streamName);
String workspaceUUID = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_ITEM_ID);
String workspaceName = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_NAME);
try {
FreeStyleProject prj = Utils.setupFreeStyleJobForWorkspace(r, workspaceName);
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, null);
RTCChangeLogSet changelog = (RTCChangeLogSet) build.getChangeSet();
// Verify name and itemId pair inside changelogset
assertEquals(workspaceName, changelog.getWorkspaceName());
assertEquals(workspaceUUID, changelog.getWorkspaceItemId());
// Since this is the first build, prevBuildUrl is null
assertEquals("", changelog.getPreviousBuildUrl());
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Verify that build definition name nad Itemid is found in the
* change log file
*
* @throws Exception
*/
@WithTimeout(600)
@Test
public void buildDefinitionNameItemIdPairFoundInChangeLogFile() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
String buildDefinitionItemId = setupArtifacts.get(Utils.ARTIFACT_BUILDDEFINITION_ITEM_ID);
try {
// Setup a build with build definition configuration
FreeStyleProject prj = Utils.setupFreeStyleJobForBuildDefinition(r, buildDefinitionId);
ArrayList<ParametersAction> pActions = new ArrayList<ParametersAction> ();
pActions.add(new ParametersAction(new StringParameterValue("buildResultUUID", "")));
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, pActions);
File changelogFile = new File(build.getRootDir(), "changelog.xml");
// Get the buildresultUUID from actions and insert it into setupArtifacts
List<RTCBuildResultAction> rtcActions = build.getActions(RTCBuildResultAction.class);
assertEquals(1, rtcActions.size());
RTCBuildResultAction action = rtcActions.get(0);
// Verify build result getting created
assertNotNull(action.getBuildResultUUID());
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_ID, action.getBuildResultUUID());
// Verify name and itemId pair inside changelog file
assertNotNull("Expecting buildDefinition Id tag", Utils.getMatch(changelogFile, ".*buildDefinitionName=\"" + buildDefinitionId +"\".*"));
assertNotNull("Expecting buildDefinition ItemId tag", Utils.getMatch(changelogFile, ".*buildDefinitionItemId=\"" + buildDefinitionItemId +"\".*"));
assertNotNull("Expecting previousBuildUrl tag", Utils.getMatch(changelogFile, ".*previousBuildUrl=\"\".*"));
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
*
* Verify that Repository workspace name and item id is found in the
* changelog file
*
* @throws Exception
*/
@WithTimeout(600)
@Test
public void repositoryWorkspaceNameItemIdPairFoundInChangeLogFile() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String streamName = getSnapshotUniqueName();
Map<String, String> setupArtifacts = Utils.setUpBuildStream(testingFacade, defaultC,
streamName);
String workspaceItemId = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_ITEM_ID);
String workspaceName = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_NAME);
try {
FreeStyleProject prj = Utils.setupFreeStyleJobForWorkspace(r, workspaceName);
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, null);
File changelogFile = new File(build.getRootDir(), "changelog.xml");
// Verify name and itemId pair inside changelog file
assertNotNull("Expecting workspaceName tag", Utils.getMatch(changelogFile, ".*workspaceName=\"" + workspaceName +"\".*"));
assertNotNull("Expecting workspaceItemId tag", Utils.getMatch(changelogFile, ".*workspaceItemId=\"" + workspaceItemId +"\".*"));
assertNotNull("Expecting previousBuildUrl tag", Utils.getMatch(changelogFile, ".*previousBuildUrl=\"\".*"));
} finally {
Utils.tearDown(testingFacade, Config.DEFAULT, setupArtifacts);
}
}
//public void streamNameItemIdPairWithPreviousBuildUrlFoundInBuildResultPage() throws Exception
//public void buildDefinitionNameItemIdPairFoundInBuildResultPage() throws Exception
//public void repositoryWorkspaceNameItemIdPairFoundInBuildResultPage() throws Exception
/**
* Build definition, normal checkout + polling through Build toolkit
* 1) Positive case when name is provided
* 2) Negative case when name is empty
*
* @throws Exception
*/
@WithTimeout(1200)
@Test
public void buildDefinitionCheckoutAndPollingWithBuildtoolkit() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
Map<String, String> setupArtifacts = Utils.setupBuildDefinition(testingFacade, defaultC,
buildDefinitionId, workspaceName, componentName);
try {
// positive case when there is a valid build definition Id
{
FreeStyleProject prj = Utils.setupFreeStyleJobForBuildDefinition(r, buildDefinitionId);
ArrayList<ParametersAction> pActions = new ArrayList<ParametersAction> ();
pActions.add(new ParametersAction(new StringParameterValue("buildResultUUID", "")));
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, pActions);
// Verify
Utils.verifyRTCScmInBuild(build, true);
RTCBuildResultAction action = build.getActions(RTCBuildResultAction.class).get(0);
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_1_ID, action.getBuildResultUUID());
// Run polling and check the log file
File pollingFile = Utils.getTemporaryFile();
PollingResult pollingResult = Utils.pollProject(prj, pollingFile);
// Ensure that there are no changes and polling happened successfully
Utils.assertPollingMessagesWhenNoChanges(pollingResult, pollingFile, buildDefinitionId);
}
// negative case when build definition id is empty
{
FreeStyleProject prj = Utils.setupFreeStyleJobForBuildDefinition(r, null);
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify that build failed and there is a check ut failure message
assertEquals(Result.FAILURE, build.getResult());
Utils.getMatch(build.getLogFile(), "RTC : checkout failure: The parameter \"buildDefinitionId\" must not be null");
// Run polling and check the log file
File pollingFile = Utils.getTemporaryFile();
PollingResult pollingResult = Utils.pollProject(prj, pollingFile);
// Ensure that there are no changes and polling happened successfully
assertEquals(Change.NONE, pollingResult.change);
Utils.getMatch(pollingFile, "RTC : checking for changes failure: More than one repository workspace has the name \"\"");
}
} finally {
Utils.tearDown(testingFacade, Config.DEFAULT, setupArtifacts);
}
}
/**
* Repository Workspace, normal checkout + polling through build toolkit
* 1) Positive case when name is provided
* 2) Negative case when name is empty
*
* @throws Exception
*/
@WithTimeout(1200)
@Test
public void repositoryWorkspaceCheckoutAndPollingWithBuildtoolkit() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String streamName = getStreamUniqueName();
Map<String, String> setupArtifacts = Utils.setUpBuildStream(testingFacade, defaultC,
streamName);
String workspaceName = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_NAME);
try {
{ // positive case - when workspaceName is not null
FreeStyleProject prj = Utils.setupFreeStyleJobForWorkspace(r, workspaceName);
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify
Utils.verifyRTCScmInBuild(build, false);
// Start polling and check whether there are no changes and polling ran successfully
// Run polling and check the log file
File pollingFile = Utils.getTemporaryFile();
PollingResult pollingResult = Utils.pollProject(prj, pollingFile);
// Verify
Utils.assertPollingMessagesWhenNoChanges(pollingResult, pollingFile, workspaceName);
}
{ // negative case - when workspaceName is null
FreeStyleProject prj = Utils.setupFreeStyleJobForWorkspace(r, null);
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify that build failed and there is a checkout failure message
assertEquals(Result.FAILURE, build.getResult());
Utils.getMatch(build.getLogFile(), "RTC : checkout failure: More than one repository workspace has the name \"null\"");
// Run polling and check the log file
File pollingFile = Utils.getTemporaryFile();
PollingResult pollingResult = Utils.pollProject(prj, pollingFile);
// Ensure that there are no changes and polling happened successfully
assertEquals(Change.NONE, pollingResult.change);
Utils.getMatch(pollingFile, "RTC : checking for changes failure: More than one repository workspace has the name \"null\"");
}
} finally {
Utils.tearDown(testingFacade, Config.DEFAULT, setupArtifacts);
}
}
/**
* Snapshot, normal checkout + polling through build toolkit
* 1) Positive case when name is provided
* 2) Negative case when name is empty
* Note that in both cases, polling should say that it is not a supported configuration.
* Checkout should succeed for the positive case and fail in the negative case.
*
* @throws Exception
*/
@WithTimeout(1200)
@Test
public void snapshotCheckoutAndPollingWithBuildtoolkit() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
try {
{ // valid snapshot UUID - checkout and polling
FreeStyleProject prj = Utils.setupFreeStyleJobForSnapshot(r, snapshotUUID);
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify the build status
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Get the build snapshot UUID from build result action
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
assertEquals(snapshotUUID, action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID));
// polling when snapshotUUID is a valid one
File pollingFile = Utils.getTemporaryFile();
PollingResult pollingResult = Utils.pollProject(prj, pollingFile);
assertEquals(Change.NONE, pollingResult.change);
assertNotNull("Expecting not supported message", Utils.getMatch(pollingFile, "Polling is not supported for this configuration. Polling is supported only for build definition, repository workspace and stream configurations."));
}
{ // null snapshot UUID - checkout and polling
FreeStyleProject prj = Utils.setupFreeStyleJobForSnapshot(r, null);
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify the build status
assertNotNull(build);
assertEquals(Result.FAILURE, build.getResult());
// polling when snapshotUUID is a valid one
File pollingFile = Utils.getTemporaryFile();
PollingResult pollingResult = Utils.pollProject(prj, pollingFile);
assertEquals(Change.NONE, pollingResult.change);
assertNotNull("Expecting not supported message", Utils.getMatch(pollingFile, "Polling is not supported for this configuration. Polling is supported only for build definition, repository workspace and stream configurations."));
}
}
finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Use this test as a placeholder for all simple validations related to build definition configuration.
*
* @throws Exception
*/
@WithTimeout(1200)
@Test
public void testBuildDefinitionConfiguration_misc() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
Map<String, String> setupArtifacts = Utils.setupBuildDefinition(testingFacade, defaultC, buildDefinitionId, workspaceName, componentName);
try {
// Create a basic project configuration
// Individual validation steps can then customize the RTCScm instance and update it in the project instance
FreeStyleProject prj = Utils.setupFreeStyleJobForBuildDefinition(r, buildDefinitionId);
// validate support for custom snapshot name
validateCustomSnapshotName_buildDef(prj, setupArtifacts, buildDefinitionId);
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Use this test as a placeholder for all simple validations related to repository workspace configuration.
*
* @throws Exception
*/
@WithTimeout(1200)
@Test
public void testRepositoryWorkspaceConfiguration_misc() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String streamName = getStreamUniqueName();
Map<String, String> setupArtifacts = Utils.setUpBuildStream(testingFacade, defaultC, streamName);
String workspaceName = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_NAME);
try {
// Create a basic project configuration
// Individual validation steps can then customize the RTCScm instance and update it in the project instance
FreeStyleProject prj = Utils.setupFreeStyleJobForWorkspace(r, workspaceName);
// validate support for custom snapshot name
validateCustomSnapshotName_repositoryWS(prj);
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Test whether temporary workspace created during build from snapshot
* is deleted after a successful build.
*/
@WithTimeout(600)
@Test
public void testTemporaryWorkspaceDeletedForSnapshotSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade.invoke(
"setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
try {
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
// setup a free style project and start a build
// verify that the temporary workspace created during the build is deleted
FreeStyleProject prj = Utils.setupFreeStyleJobForSnapshot(r, snapshotUUID);
FreeStyleBuild build = Utils.runBuild(prj, null);
// Ensure build is successful
assertTrue(build.getLog().toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Ensure non null snapshot UUID
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
assertEquals(snapshotUUID, action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID));
// Make a testing facade call to ensure that the temporary workspace does not exist.
String [] workspaceItemIds = Utils.findTemporaryWorkspaces();
assertEquals(0, workspaceItemIds.length);
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Test whether temporary workspace created during build from snapshot is deleted
* even if load fails
*
* @throws Exception
*/
@WithTimeout(600)
@Test
public void testTemporaryWorkspaceDeletedForSnapshotLoadFailure() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade.invoke(
"setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
try {
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
// setup a free style project with an invalid load path and start a build
// verify that the temporary workspace created during the build is deleted
String loadDirectory = Utils.getInvalidLoadPath();
FreeStyleProject prj = Utils.setupFreeStyleJobForSnapshot(r, snapshotUUID, loadDirectory);
FreeStyleBuild build = Utils.runBuild(prj, null);
// Ensure build is successful
assertTrue(build.getLog().toString(), build.getResult().isWorseOrEqualTo(Result.FAILURE));
// Ensure non null snapshot UUID
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
assertEquals(snapshotUUID, action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID));
// Make a testing facade call to ensure that the temporary workspace does not exist.
String [] workspaceItemIds = Utils.findTemporaryWorkspaces();
assertEquals(0, workspaceItemIds.length);
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Check for
* team_scm_snapshotUUID
* repositoryAddress
* team_scm_changesAccepted should be null forever
* @throws Exception
*/
@Test
public void testBuildPropertiesInSnapshotBuild() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
try {
FreeStyleProject prj = Utils.setupFreeStyleJobForSnapshot(r, snapshotUUID);
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify the build status
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Verify the build properties from RTCBuildResultAction
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
Map<String, String> buildProperties = action.getBuildProperties();
// Check for known properties
assertEquals(snapshotUUID, buildProperties.get(Utils.TEAM_SCM_SNAPSHOTUUID));
assertEquals(loginInfo.getServerUri(), buildProperties.get(Utils.REPOSITORY_ADDRESS));
// Doesn't make sense for a snapshot build
assertNull(buildProperties.get(Utils.TEAM_SCM_ACCEPT_PHASE_OVER));
assertNull(buildProperties.get(Utils.TEAM_SCM_CHANGES_ACCEPTED));
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Check for
* team_scm_snapshotUUID,
* repositoryAddress,
* team.scm.acceptPhaseOver,
* team.scm.changesAccepted may be non zero from the very first build
* @throws Exception
*/
@Test
public void testBuildPropertiesInWorkspaceBuild() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
String streamName = getStreamUniqueName();
Map<String, String> setupArtifacts = Utils.setUpBuildStream(testingFacade, defaultC,
streamName);
String workspaceName = setupArtifacts.get(Utils.ARTIFACT_WORKSPACE_NAME);
try {
FreeStyleProject prj = Utils.setupFreeStyleJobForWorkspace(r, workspaceName);
// Run a build
FreeStyleBuild build = Utils.runBuild(prj, null);
// Get Build Properties out of RTCBuildResultAction
List<RTCBuildResultAction> actions = build.getActions(RTCBuildResultAction.class);
assertTrue(actions.size() == 1);
Map<String, String> buildProperties = actions.get(0).getBuildProperties();
assertEquals(defaultC.getLoginInfo().getServerUri(),
buildProperties.get(Utils.REPOSITORY_ADDRESS));
assertNotNull(buildProperties.get(Utils.TEAM_SCM_SNAPSHOTUUID));
assertNotNull(buildProperties.get(Utils.TEAM_SCM_ACCEPT_PHASE_OVER));
// Changes would have been dropped since the stream doesn't have some
// change sets
assertTrue(Integer.parseInt(buildProperties.get(Utils.TEAM_SCM_CHANGES_ACCEPTED))>0);
} finally {
Utils.tearDown(testingFacade, defaultC, setupArtifacts);
}
}
/**
* Validate the snapshot name generated in the builds - with and without providing custom snapshot name
*
* @param prj
* @param setupArtifacts
* @param buildDefinitionId
* @throws Exception
*/
private void validateCustomSnapshotName_repositoryWS(FreeStyleProject prj) throws Exception {
// Run a build, without providing custom snapshot name
FreeStyleBuild build = Utils.runBuild(prj, null);
// Verify that by default the snapshot name is set to <Job Name>_#<Build Number>
RTCChangeLogSet changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals(prj.getName() + "_#" + build.getNumber(), changelog.getBaselineSetName());
// update the job configuration with custom snapshot name
// but do not set overrideDefaultSnapshotName to true. Should use default snapshot name even if a custom snapshot name is provided
RTCScm rtcScm = (RTCScm)prj.getScm();
BuildType buildType = rtcScm.getBuildType();
buildType.setCustomizedSnapshotName("jenkins_${JOB_NAME}_#${BUILD_NUMBER}");
prj.setScm(Utils.updateAndGetRTCScm(rtcScm, buildType));
build = Utils.runBuild(prj, null);
// Verify that the snapshot name is set to the default value
changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals(prj.getName() + "_#" + build.getNumber(), changelog.getBaselineSetName());
// update the job configuration with custom snapshot name and set overrideDefaultSnapshotName to true
rtcScm = (RTCScm)prj.getScm();
buildType = rtcScm.getBuildType();
buildType.setOverrideDefaultSnapshotName(true);
buildType.setCustomizedSnapshotName("jenkins_${JOB_NAME}_#${BUILD_NUMBER}");
prj.setScm(Utils.updateAndGetRTCScm(rtcScm, buildType));
build = Utils.runBuild(prj, null);
// Verify that the template specified in the custom snapshot name is resolved and set as the name of the
// generated snapshot
changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals("jenkins_" + prj.getName() + "_#" + build.getNumber(), changelog.getBaselineSetName());
// update the job configuration with custom snapshot name that resolves to an empty string and set overrideDefaultSnapshotName to true
rtcScm = (RTCScm)prj.getScm();
buildType = rtcScm.getBuildType();
buildType.setOverrideDefaultSnapshotName(true);
buildType.setCustomizedSnapshotName("${emptyParam}");
prj.setScm(Utils.updateAndGetRTCScm(rtcScm, buildType));
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(new ParameterDefinition[] {new StringParameterDefinition("emptyParam", " ")})));
build = Utils.runBuild(prj, Collections.singletonList(new ParametersAction(new StringParameterValue("emptyParam", " "))));
// Verify that the snapshot name is set to a default value
changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals(prj.getName() + "_#" + build.getNumber(), changelog.getBaselineSetName());
// Verify that the console output has the log message
assertNotNull(Utils
.getMatch(build.getLogFile(), java.util.regex.Pattern.quote(Messages.RTCScm_empty_resolved_snapshot_name("${emptyParam}"))));
}
/**
* Validate the snapshot name generated in the builds - with and without providing custom snapshot name
*
* @param prj
* @param setupArtifacts
* @param buildDefinitionId
* @throws Exception
*/
private void validateCustomSnapshotName_buildDef(FreeStyleProject prj, Map<String, String> setupArtifacts, String buildDefinitionId)
throws Exception {
ArrayList<ParametersAction> pActions = new ArrayList<ParametersAction> ();
pActions.add(new ParametersAction(new StringParameterValue("buildResultUUID", "")));
// Run a build, without providing custom snapshot name
FreeStyleBuild build = Utils.runBuild(prj, pActions);
RTCBuildResultAction action = build.getActions(RTCBuildResultAction.class).get(0);
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_ID, action.getBuildResultUUID());
// Verify
// By default snapshot name should be <Build Definition Id>_<Build Number>
RTCChangeLogSet changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals(buildDefinitionId + "_#" + build.getNumber(), changelog.getBaselineSetName());
// update the job configuration with custom snapshot name
// but do not set overrideDefaultSnapshotName to true. Should use default snapshot name even if a custom snapshot name is provided
RTCScm rtcScm = (RTCScm)prj.getScm();
BuildType buildType = rtcScm.getBuildType();
buildType.setCustomizedSnapshotName("jenkins_${JOB_NAME}_#${BUILD_NUMBER}");
prj.setScm(Utils.updateAndGetRTCScm(rtcScm, buildType));
build = Utils.runBuild(prj, null);
action = build.getActions(RTCBuildResultAction.class).get(0);
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_1_ID, action.getBuildResultUUID());
// Verify that the snapshot name is set to the default value
changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals(buildDefinitionId + "_#" + build.getNumber(), changelog.getBaselineSetName());
// update the job configuration with custom snapshot name and set overrideDefaultSnapshotName to true
rtcScm = (RTCScm)prj.getScm();
buildType = rtcScm.getBuildType();
buildType.setOverrideDefaultSnapshotName(true);
buildType.setCustomizedSnapshotName("jenkins_${JOB_NAME}_#${BUILD_NUMBER}");
prj.setScm(Utils.updateAndGetRTCScm(rtcScm, buildType));
build = Utils.runBuild(prj, null);
action = build.getActions(RTCBuildResultAction.class).get(0);
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_2_ID, action.getBuildResultUUID());
// Verify that the template specified in the custom snapshot name is resolved and set as the name of the
// generated snapshot
changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals("jenkins_" + prj.getName() + "_#" + build.getNumber(), changelog.getBaselineSetName());
// update the job configuration with custom snapshot name that resolves to an empty string and set overrideDefaultSnapshotName to true
rtcScm = (RTCScm)prj.getScm();
buildType = rtcScm.getBuildType();
buildType.setOverrideDefaultSnapshotName(true);
buildType.setCustomizedSnapshotName("${emptyParam}");
prj.setScm(Utils.updateAndGetRTCScm(rtcScm, buildType));
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(new ParameterDefinition[] {new StringParameterDefinition("emptyParam", " ")})));
build = Utils.runBuild(prj, Collections.singletonList(new ParametersAction(new StringParameterValue("emptyParam", " "))));
action = build.getActions(RTCBuildResultAction.class).get(0);
setupArtifacts.put(Utils.ARTIFACT_BUILDRESULT_ITEM_3_ID, action.getBuildResultUUID());
// Verify that the snapshot name is set to a default value
changelog = (RTCChangeLogSet)build.getChangeSet();
assertEquals(buildDefinitionId + "_#" + build.getNumber(), changelog.getBaselineSetName());
// Verify that the console output has the log message
assertNotNull(Utils.getMatch(build.getLogFile(),
java.util.regex.Pattern.quote(Messages.RTCScm_empty_resolved_snapshot_name("${emptyParam}"))));
}
}